package cn.tedu.api;
/**本类用于练习String字符串的创建*/
public class TestString {
    public static void main(String[] args) {
        char[] value = {'a','b','c'};
        /**1.字符串类型底层维护的是char[],存在堆内存中，每new一次，开辟新空间*/
        String s1 = new String(value);
        String s11 = new String(value);

        String s2 = "abc";
        String s22 = "abc";
        String s3 = "ccc";

        /**这样创建的方式，会将字符串存在堆中的常量池中，效率高
         * 如果是第一次使用这个字符串，会在堆中常量池创建一个对象
         * 当再次使用相同内容时，会直接访问之前创建好的对象，不再新建了*/
        System.out.println(s1==s11);//false，在堆中创建了两个对象
        System.out.println(s2==s22);//true，都指向堆中常量池同一块地址
        System.out.println(s1==s2);//false,两种创建方式，一个堆里，一个在堆中常量池中
        System.out.println(s2==s3);//false,都在常量池，但是串的内容不一样，是两个对象

        /**Object中equals()的默认实现是==比较，比较的是两个字符串对象的地址值
         * 但是String类自己已经重写了继承自父类的这个方法，重写后，不再比较字符串对象的地址值
         * 不论创建方式，只要两个串的内容一致，equals()就返回true,比较的是内容(值)*/
        System.out.println(s1.equals(s11));//true,字符串的内容一致
        System.out.println(s1.equals(s2));//true,字符串的内容一致
        System.out.println(s2.equals(s3));//false,字符串的内容不一致
    }
}
